import { def } from './utils'

// 1、Array.prototype
const arrayPrototype = Array.prototype

// 2、以Array.prototype为原型创建对象
export const arrayMethods = Object.create(arrayPrototype)

// 3、要改写的方法，注意一旦有插入操作，插入的数据也要响应式
const methodsNeedChange = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']

methodsNeedChange.forEach(methodName => {
  // 备份原来的方法
  const original = arrayPrototype[methodName]

  // 定义新的方法
  def(arrayMethods, methodName, function(){
    console.log(`change the '${methodName}'`)
    // 取出数组的__ob__属性
    const ob = this.__ob__
    // 参数列表
    const args = [...arguments]
    // 下面，是为了让插入的数据也变成响应式的
    let inserted = [];
    switch (methodName) {
      case 'push':
      case 'unshift':
        inserted = args;break;
      case 'splice':
        inserted = args.slice(2);break;
    }
    if (inserted.length) {
      ob.observeArray(inserted)
    }

    ob.dep.notify()

    // 原来的功能
    return original.apply(this, arguments) // apply的this，指的是运行时的调用者
  }, false)
})
